#!/usr/bin/python
# -*- coding:UTF8 -*-
# 处理异常
# try:
#     执行代码
# excpet 异常类型：
# 	处理代码
import time
from io import UnsupportedOperation

try:
    with open('.pytest_cache/helloword.txt', mode='r', encoding='utf8') as file:
        print(file.read())
except FileNotFoundError:  # 如果程序出现文件找到不到异
    print('"对不起，文件找不到。请重新检查文件路径"')

# 针对同一个程序可以添加多个异常处理。如果异常信息处理不到，可以添加 except  Exception 匹配所有异常
try:
    with open('testdata.csv', mode='rb', encoding='utf8') as file:
        print(file.write())
except FileNotFoundError:  # 如果程序出现文件找到不到异
    print('"对不起，文件找不到。请重新检查文件路径"')
except UnsupportedOperation:
    print('不支持此操作')
except UnicodeDecodeError:
    print('对不起，文件编码有误。请将文件编码改为UTF8编码')
except PermissionError:
    print("对不起,文件权限不足，请联系管理员")
# Excpetion 包括所有的异常
except Exception:
    print("出现未知异常信息")

print(''.center(30, '='))

# Exception返回不确定的异常
"""
try:
        可能发生错误的代码
except Exception as 变量:
        print(变量名)
"""
分子 = int(input('请输入分子：'))
分母 = int(input('请输入分母：'))
try:
    print(分子 / 分母)
except Exception as 报错信息:
    print(f'报错信息是：{报错信息}')
else:
    print('看到我证明这个程序没有异常')
print(''.center(30, '='))
"""
finally表示：
无论是否异常都要执行的代码
例如：关闭文件
"""
try:
    文件 = open('data.text', 'r')
except:
    文件 = open('data.text', 'w', encoding='utf8')  # 没有文件自动创建
    print('如果没文件就新建')
    文件.write('我是中国人')
else:
    print('无异常')
finally:
    文件.close()
print(''.center(30, '='))
try:
    with open('data.csv', 'r', encoding='utf8') as file:
        for 内容 in file:
            print(内容)
except Exception as 报错信息:
    print(f'报错信息为：{报错信息}')
print(''.center(30, '-'))

# 异常传递    【了解即可】
"""
1、尝试只读方式打开文件，如果文件存在则读文件的内容，否则提示用户文件不存在
2、读取内容要求：尝试循环读取内容，读取过程中如果检测到用户意外终止程序，则except捕获异常并提示用户。
"""
try:
    file = open('data.csv', 'r', encoding='utf8')
    try:
        while True:
            内容 = file.readline()  # 每次读取一行
            if len(内容) == 0:
                break
            time.sleep(1)
            print(内容)
    except:
        # 文件读取被意外终止，如Ctrl+C
        print('文件读取被意外终止')
    finally:
        file.close()
        print('文件关闭')
except:
    print('没有这个文件')
print(''.center(30, '='))

# 自定义异常： raise 异常类对象
"""
作用：将不满足程序逻辑的情况，反馈给用户，就是用来报错，不是语法错误，而是不满足程序逻辑要求的错误。
例如：输入密码长度不符合要求，很多网站都要求不能低于8位，要求大小写字母，要求有特殊字符等。
"""


# 自定义异常类，继承Excepttion
class passswd(Exception):
    def __init__(self, length, min_length):
        self.length = length
        self.min_length = min_length

    def __str__(self):
        return f'输入的长度为{self.length}个字符，最小长度不能少于{self.min_length}字符'


def raise_error():
    try:
        input_len = input('请输入密码：')
        if len(input_len) < 3:
            raise passswd(len(input_len), 3)
    except Exception as error_ins:
        print(error_ins)
    else:
        print('密码输入完成')


raise_error()
print(''.center(30, '='))

# 【异常总结】
"""
1.捕获异常：
try 异常类型
    代码
except 异常类型 as xx：
    代码
    
2.异常语法：
try：
    可能发生的异常代码
except:
    如果出现异常执行的代码
else：
    没有异常执行的代码
finally：
    无论是否异常都要执行的代码
    
3.自定义异常：
class 异常类(Exception):
    代码
#设置抛出异常的描述信息
    def __str__(self):
        return ...
#抛出异常
raise 异常类名
#捕获异常
except Exception
    
"""
